package org.niux.aims.service.impl;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import org.niux.aims.common.util.StringUtil;
import org.niux.aims.dao.IAccountDAO;
import org.niux.aims.dao.IApplicationDAO;
import org.niux.aims.dao.IEntitysDAO;
import org.niux.aims.models.Account;
import org.niux.aims.models.Application;
import org.niux.aims.models.Auth;
import org.niux.aims.models.Entitys;
import org.niux.aims.service.IAccountService;
import org.niux.aims.vo.AccountVO;
import org.niux.aims.vo.ApplicationVO;
import org.niux.aims.vo.AuthVO;
import org.springframework.stereotype.Service;

/**
 * 
 * Copyright (c) 2009,niux<br>
 * All rights reserved.<br>
 * 
 * 文件名称：AccountService.java<br>
 * 摘    要：账户数据操作服务类<br>
 * <br>
 * 当前版本：<br>
 * 作    者：铭显 Email: <a href="mailto:liangmingxian@gmail.com">liangmingxian@gmail.com</a><br>
 * 完成日期：@since 2013-7-29<br>
 * <br>
 * 取代版本：<br>
 * 原作者  ：<br>
 * 完成日期：@since Oct 22, 2009<br>
 */
@Service(value="accountService")
public class AccountService implements IAccountService {

	@Resource(name="accountDao")
	private IAccountDAO accountDao;
	
	@Resource(name="applicationDao")
	private IApplicationDAO applicationDao;
	
	@Resource(name="entityDao")
	private IEntitysDAO entityDao;
	
	/**
	 * 方法概述：根据账户名和所属应用查找账户数据
	 * 描述：根据账户名和所属应用查找账户数据
	 * @param name
	 * @param appid
	 * @return
	 * 返回类型：
	 * 修改人：梁铭显
	 * 修改时间：2013-7-29
	 */
	public List<AccountVO> findByNameAndApp(String name, Integer appid){
		List<Account> accounts = accountDao.findByNameAndApp(name, appid);
		
		List<AccountVO> accountVos = new ArrayList<AccountVO>();
		
		for (Account account : accounts) {
			AccountVO accountVo = new AccountVO();
			
			accountVo.setId(account.getId());
			
			ApplicationVO app = new ApplicationVO();
			app.setAppName(account.getApplication().getAppName());
			
			accountVo.setApp(app);
			accountVo.setName(account.getName());
			accountVo.setPassword(account.getPassword());
			
			SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
			accountVo.setDate(simpleDateFormat.format(account.getDate()));
			
			accountVos.add(accountVo);
		}
		
		return accountVos;
	}
	
	/**
	 * 
	 * 方法概述：获取所有账户数据
	 * 描述：获取所有账户数据
	 * @return
	 * 返回类型：List<Account>
	 * 修改人：梁铭显
	 * 修改时间：2013-8-1
	 */
	public List<Account> findAll(){
		List<Account> accounts = accountDao.findAll();
		return accounts;
	}
	
	/**
	 * 
	 * 方法概述：根据账户名称查找账户数据
	 * 描述：根据账户名称查找账户数据
	 * @param accountName
	 * @return
	 * 返回类型：List<Account>
	 * 修改人：梁铭显
	 * 修改时间：2013-9-2
	 */
	public List<Account> findByAccountName(String accountName){
		List<Account> accounts = accountDao.findByName(accountName);
		return accounts;
	}
	 
	/**
	 * 
	 * 方法概述：分页获取账户数据
	 * 描述：分页获取账户数据
	 * @param startPage
	 * @param pageSize
	 * @return
	 * 返回类型：List<AccountVO>
	 * 修改人：梁铭显
	 * 修改时间：2013-8-27
	 */
	public List<AccountVO> findByPage(int startPage,int pageSize,String queryArg){
		List<Account> accounts = accountDao.findByPage(startPage, pageSize,queryArg);
		
		List<AccountVO> accountVos = new ArrayList<AccountVO>();
		
		for (Account account : accounts) {
			AccountVO accountVo = new AccountVO();
			
			accountVo.setId(account.getId());
			
			ApplicationVO app = new ApplicationVO();
			app.setAppName(account.getApplication().getAppName());
			
			accountVo.setApp(app);
			accountVo.setName(account.getName());
			accountVo.setPassword(account.getPassword());
			
			SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
			accountVo.setDate(simpleDateFormat.format(account.getDate()));
			
			accountVos.add(accountVo);
		}
		
		return accountVos;
	}
	
	/**
	 * 
	 * 方法概述：根据ID获取账户数据
	 * 描述：根据ID获取账户数据
	 * @param id
	 * @return
	 * 返回类型：AccountVO
	 * 修改人：梁铭显
	 * 修改时间：2013-8-27
	 */
	public AccountVO findById(int id){
		Account account = accountDao.findById(id);
		
		if(account != null){
			AccountVO accountVo = new AccountVO();
			
			accountVo.setId(account.getId());
			
			ApplicationVO app = new ApplicationVO();
			app.setId(account.getApplication().getId());
			app.setAppName(account.getApplication().getAppName());
			
			accountVo.setApp(app);
			accountVo.setName(account.getName());
			accountVo.setPassword(account.getPassword());
			
			return accountVo;
		} else {
			return null;
		}
	}
	
	/**
	 * 
	 * 方法概述：新增账户数据
	 * 描述：新增账户数据
	 * @param accountVo
	 * 返回类型：void
	 * 修改人：梁铭显
	 * 修改时间：2013-8-27
	 */
	public void save(AccountVO accountVo){
		Account account = new Account();
		account.setName(accountVo.getName());
		account.setPassword(StringUtil.MD5Encode(accountVo.getPassword()));
		account.setDate(new Date());
		
		Application app = applicationDao.findById(accountVo.getApp().getId());
		
		account.setApplication(app);
		
		accountDao.save(account);
	}
	
	/**
	 * 
	 * 方法概述：修改账户数据
	 * 描述：修改账户数据
	 * @param accountVo
	 * 返回类型：void
	 * 修改人：梁铭显
	 * 修改时间：2013-8-27
	 */
	public void update(AccountVO accountVo){
		Account account = accountDao.findById(accountVo.getId());
		account.setName(accountVo.getName());
		
		Application app = applicationDao.findById(accountVo.getApp().getId());
		account.setApplication(app);
		
		accountDao.update(account);
	}
	
	/**
	 * 
	 * 方法概述：修改账户密码
	 * 描述：修改账户数据
	 * @param accountVo
	 * 返回类型：void
	 * 修改人：梁铭显
	 * 修改时间：2013-9-2
	 */
	public void updatePassword(AccountVO accountVo){
		Account account = accountDao.findById(accountVo.getId());
		account.setPassword(StringUtil.MD5Encode(accountVo.getPassword()));
		accountDao.update(account);
	}	
	
	/**
	 * 
	 * 方法概述：根据账户ID判断密码是否正确
	 * 描述：根据账户ID判断密码是否正确
	 * @param id
	 * @param password
	 * @return
	 * 返回类型：boolean
	 * 修改人：梁铭显
	 * 修改时间：2013-9-2
	 */
	public boolean checkPassword(int id,String password){
		Account account = accountDao.findById(id);
		
		if(StringUtil.MD5Encode(password).equals(account.getPassword())){
			return true;
		} else {
			return false;
		}
	}
	
	/**
	 * 
	 * 方法概述：删除账户数据
	 * 描述：删除账户数据
	 * @param id
	 * 返回类型：void
	 * 修改人：梁铭显
	 * 修改时间：2013-8-27
	 */
	public void delete(int id){
		Account account = new Account();
		account.setId(id);
		accountDao.delete(account);
	}
	
	/**
	 * 
	 * 方法概述：分配权限
	 * 描述：分配权限
	 * @param accountVo
	 * 返回类型：void
	 * 修改人：梁铭显
	 * 修改时间：2013-9-5
	 */
	public void assignmentAuths(AccountVO accountVo){
		Account account = accountDao.findById(accountVo.getId());
		account.getAuths().clear();
		
//		accountDao.update(account);
		
		for (AuthVO authVo : accountVo.getAuths()) {
			Auth auth = new Auth();
			auth.setAccount(account);
			
			Entitys entitys = entityDao.findById(Integer.parseInt(authVo.getEntity().getId()));
			auth.setEntitys(entitys);
			
			account.getAuths().add(auth);
		}
		
		accountDao.update(account);
	}
}
